package com.mlh.array;

import java.util.Arrays;

/**
 * @author 缪林辉
 * @date 2024/8/15 13:19
 * @DESCRIPTION
 */
//给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
//输入: nums = [1,2,3,4,5,6,7], k = 3
// 输出: [5,6,7,1,2,3,4]
// 解释:
// 向右轮转 1 步: [7,1,2,3,4,5,6]
// 向右轮转 2 步: [6,7,1,2,3,4,5]
// 向右轮转 3 步: [5,6,7,1,2,3,4]
public class 轮转数组 {
    public static void main(String[] args) {
        int []nums={1,2,3,4,5,6,7};
        method1(nums,3);
        System.out.println(Arrays.toString(nums));
    }
    //用空间换时间
    public static void method1(int[] nums, int k) {
        int len=nums.length;
        int[]res=new int[len];
        for (int i = 0; i < len; i++) {
            res[(i+k)%len]=nums[i];
        }
        for (int i = 0; i < len; i++) {
            nums[i]=res[i];
        }
    }
    //参考力扣  环状替换  该算法可以实现原地 空间复杂度为O（1）
    public static void practice(int[] nums, int k) {
        int len=nums.length;
        k=k%len;
        int count=0;
        for (int i = 0; i <len&&count<len ; i++) {
            int pre=nums[i];
            int cur=i;
            do{
                int next=(cur+k)%len;//下一个数的下标
                int temp=nums[next];//下一个数值
                nums[next]=pre;//下一个数位置放置上一个位置的值
                cur=next;//切换到下一为止
                pre=temp;
                ++count;
            }while (cur!=i&&count<len);
        }
    }

}
